#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 读取图像
    std::string image_path = "../LingXiao.png";
    cv::Mat img = cv::imread(image_path);

    // 检查图像是否成功读取
    if (img.empty()) {
        std::cerr << "Error: Image not found or unable to open the image at path: " << image_path << std::endl;
        return 1;
    }

    // 图像的加法
    cv::Mat img_add;
    cv::add(img, cv::Scalar(100, 100, 100), img_add); // 每个通道加 100

    // 图像的减法
    cv::Mat img_sub;
    cv::subtract(img, cv::Scalar(100, 100, 100), img_sub); // 每个通道减 100

    // 图像的乘法
    cv::Mat img_mul;
    img.convertTo(img_mul, -1, 1.5, 0); // 每个像素值乘 1.5

    // 图像的除法
    cv::Mat img_div;
    img.convertTo(img_div, -1, 0.5, 0); // 每个像素值除以 2

    // 图像的按位与
    cv::Mat img_bitwise_and;
    cv::bitwise_and(img, cv::Scalar(100, 100, 100), img_bitwise_and);

    // 图像的按位或
    cv::Mat img_bitwise_or;
    cv::bitwise_or(img, cv::Scalar(100, 100, 100), img_bitwise_or);

    // 图像的按位异或
    cv::Mat img_bitwise_xor;
    cv::bitwise_xor(img, cv::Scalar(100, 100, 100), img_bitwise_xor);

    // 图像的取反
    cv::Mat img_not;
    cv::bitwise_not(img, img_not);

    // 创建一个纯黑色图像
    cv::Mat black_img = cv::Mat::zeros(img.size(), img.type());

    // 在纯黑色图像上写一句话
    std::string text = "(opencv) joke@ShineZhang:~/ln_opencv/03_img_opt/python$: ";
    int font = cv::FONT_HERSHEY_SIMPLEX;
    double font_scale = 0.5;
    int thickness = 1;
    cv::putText(black_img, text, cv::Point(10, 50), font, font_scale, cv::Scalar(255, 255, 255), thickness);

    // 图像混合
    cv::Mat img_blend;
    cv::addWeighted(img, 0.2, black_img, 0.8, 0, img_blend);

    // 显示图像
    cv::imshow("LingXiao", img);
    cv::imshow("Blended Image", img_blend);

    // 等待按键
    std::cout << "Press ESC to close the windows." << std::endl;
    while (true) {
        int key = cv::waitKey(0);
        if (key == 27) { // ESC 键
            break;
        } else {
            std::cout << "Key pressed: " << key << std::endl;
        }
    }

    // 关闭所有窗口
    cv::destroyAllWindows();

    return 0;
}
